GitHub Actions 定时任务
因为 GitHub 上 fork 的仓库比较多,每次都要一个个点进去看需不需要 update,有点麻烦,所以我前段时间在 GitHub 上创建了一个非常简单的自动同步和通过企业微信发送 fork 仓库状态的项目。

一开始还挺正常的,但过了一阵发现微信收到通知的时间有时是凌晨 4 点,有时是晚上 9 点,不太固定。总结一下,就是 GitHub Actions 定时任务(schedule)执行时间不稳定。
问了 deepseek 后,才知道这种自动触发的定时任务是会被排到GitHub 全球共享队列里的。而我一开始设定的北京时间晚上 7 点(即 11:00 UTC)是全球定时任务的整点高峰期,大量任务同时触发,导致我的任务需要排队等待,延迟时间从几分钟到数小时不等。
而 GitHub Actions 官方明确表示,schedule 事件是 “best-effort”(尽力而为),不保证精确执行时间。平台会优先保障 push、pull_request 等实时构建任务,定时任务在系统负载高时会被延迟甚至丢弃。
并且如果仓库超过 60 天 没有任何代码推送活动,GitHub 可能自动禁用定时工作流,进一步影响执行稳定性。
所以我把时间改成了北京时间早上 07:42(即 23:42 UTC),避开高峰时期。实际体验中一般在北京时间上午 9 点或 10 点多才能收到推送通知。 并且之后定期向推送一次无意义的微小更新(例如更新 README),防止仓库被判定为不活跃而静默禁用定时任务。如果是本地仓库推送到远程仓库的话,可以设置:
# 示例:定期修改 README 并提交
echo "Last check: $(date)" >> README.md
git add README.md
git commit -m "chore: keep repository active for scheduled workflows"
git push
但因为这个项目非常简单,我最初就直接在 GitHub 上新建了个远程仓库添加文件了,所以没办法这么做。
其实如果实在需要定时任务精确执行的话,可以放弃 GitHub 内部调度,改用外部触发器。例如 cron-job.org 等免费服务,通过在精确时间点向 GitHub API 发送请求,触发 workflow_dispatch 事件(需要配置 GH_TOKEN),这样能完全绕过 GitHub 的排队机制,实现准时触发。
不过我这个不太需要精确到 1 分钟内的精度,所以没弄。